package com.util;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;
import java.io.IOException;

import static com.util.Util.getRealPath;

/**
 * 上传文件工具类
 *
 * @author wang_
 * @version 2024.3.4.1
 * @description
 * @date 2025/7/10
 */
public class PartTool {
	/// 文件
	private final Part   part;
	/// 文件保存路径
	private final String filePath;
	/// 文件保存位置
	private final String location;
	
	/**
	 * 构造函数
	 *
	 * @param part    文件
	 * @param session session
	 * @param path    文件保存位置
	 */
	public PartTool(Part part, HttpSession session, String path) {
		this(part, getRealPath(session, path), path);
	}
	
	private PartTool(Part part, String location, String path) {
		this.part     = part;
		this.location = location;
		this.filePath = path + "/" + getFileName();
	}
	
	/// 获取文件名
	public String getFileName() {
		return part.getSubmittedFileName();
	}
	
	/**
	 * 构造函数
	 *
	 * @param part    文件
	 * @param request request
	 * @param path    文件保存位置
	 */
	public PartTool(Part part, HttpServletRequest request, String path) {
		this(part, getRealPath(request, path), path);
	}
	
	/**
	 * 生成 {@link PartTool} 并立即保存文件
	 *
	 * @param part    文件
	 * @param session session
	 * @param path    文件保存位置
	 * @return {@link PartTool}
	 * @throws IOException IO异常
	 */
	public static PartTool SessionBuilder(Part part, HttpSession session, String path) throws IOException {
		return Builder(part, getRealPath(session, path), path);
	}
	
	public static PartTool Builder(Part part, String location, String path) throws IOException {
		PartTool partTool = new PartTool(part, location, path);
		partTool.write();
		return partTool;
	}
	
	/// 保存文件
	public void write() throws IOException {
		part.write(location);
	}
	
	/**
	 * 生成 {@link PartTool} 并立即保存文件
	 *
	 * @param part    文件
	 * @param request request
	 * @param path    文件保存位置
	 * @return {@link PartTool}
	 * @throws IOException IO异常
	 */
	public static PartTool SessionBuilder(Part part, HttpServletRequest request, String path) throws IOException {
		return Builder(part, getRealPath(request, path), path);
	}
	
	public void write(String location) throws IOException {
		part.write(location);
	}
	
	/// 获取文件
	public Part getPart() {
		return part;
	}
	
	/// 获取文件保存路径
	public String getFilePath() {
		return filePath;
	}
	
	/// 获取文件保存位置
	public String getLocation() {
		return location;
	}
}
